CACHE' WWW


Материалы книги: Кирстен В., Ирингер М., Рёринг Б., Шульте П. СУБД Cache: объектно-ориентированная разработка приложений. Учебный курс.-СПб.:Питер,2001.-384с.:ил.

Тема индивидуального задания "Cache WWW" выбрана неслучайно. Покупка новой программы предприятием, на котором я работаю, потребовала от меня изучения новой постреляционной СУБД - Cache. В связи с тем, что Cache' Server Pages - это технология для разработки и функционирования высокопроизводительных динамических web-приложений, я решила совместить изучение Cache c изучаемой в данном семестре дисциплиной "Сетевые информационные технологии".

1.2. Что такое CSP

1.3.CSP на практике

1.4. Немного подробностей

2. Первые шаги с CSP Web Gateway

2.1.Конфигурированиe CSP Web Gateway

2.2.Создание приложения

2.2.1. Описание приложения в менеджере конфигураций Cache

2.2.2. Каталоги приложения.

2.2.3. Режимы работы приложения

2.2.4. Имена файлов и ссылки (URL)

2.3. Обзор CSP-программирования

2.3.1. Синтаксические элементы страниц

2.3.2.Создание Cache Server Pages

2.3.3. Пример динамической страницы

2.3.4. Что делает браузер

2.4. Работа с переменными в Cache Server Pages

2.4.1. Простая подстановка значения

2.4.2. Использование глобальных переменных

2.5. Дополнительные возможности CSP

2.5.1. Запросы к базе данных в CSP

2.5.2. Циклы в CSP

2.5.3. Условная генерация HTML

2.5.4. Атрибут CSP:BIND

3. Взаимодействие с CSP

3.1. Использование форм

3.1.1. Объект %CSP.Request

3.1.2. Использование результатов запроса

3.1.3. Множественные значения поля ввода

3.1.4. Путешествие по полям формы

3.1.5. Операции с объектом %request

3.2. Управление сеансом

3.2.1. Обработка пользовательского сеанса

3.2.2. Свойства объекта %session

3.2.3. Методы объекта %session

4. Пример приложения

4.1. Создание CSP- страниц

4.2. Установление связи с базой данных

4.3. Обновление базы данных

4.4. Завершение Web-приложения




1.Введение


Объектно-ориентированные базы данных (ООБД) по сравнению с традиционными (например, реляционными) БД обеспечивают следующие преимущества: во-первых, в таких БД хранятся не только данные, но и методы их обработки, инкапсулированные в одном объекте; во-вторых, ООБД позволяют обрабатывать мультимедийные данные; в-третьих, ООБД допускают работу на высоком уровне абстракции; в-четвертых, ООБД позволяют пользователям создавать структуры данных любой сложности.

Отличительной особенностью СУБД Cache' является независимость хранения данных от способа их представления, что реализуется с помощью, так называемой, единой архитектуры данных Cache'. В рамках данной архитектуры существует единое описание объектов и таблиц, отображаемых непосредственно в многомерные структуры ядра базы данных, ориентированных на обработку транзакций [1]. Как только определяется класс объектов, Cache' автоматически генерирует реляционное описание данных этого класса в формате SQL. Подобным же образом, как только в Словарь данных поступает DDL-описание в формате реляционной базы данных, Cache' автоматически генерирует реляционное и объектное описание данных, устанавливая тем самым доступ в формате объектов. При этом все описания ведутся согласованно, все операции по редактированию проводятся только с одним описанием данных. Это позволяет сократить время разработки, сэкономить вычислительные ресурсы и приложения будут работать значительно быстрее.

БД Cache' была первой базой данной, предназначенной для работы в сети Internet/Intranet. В версии Cache' 4.0. реализована технология создания динамических web-приложений Cache' Server Pages (CSP), которая пришла на смену технологии Weblink предыдущих версий Cache'. Кроме этого, системная библиотека %Net предоставляет классы, реализующие протоколы SMTP, POP3, HTTP, FTP и др.

1.1. Основные компоненты СУБД Cache'


На рис. 1. представлена архитектура Cache'.

Рис.1. Архитектура системы Cache'.

1.2.Что такое CSP?

Cache' Server Pages -- это технология для разработки и функционирования высокопроизводительных динамических web-приложений. На первый взгляд эта технология похожа на Microsoft ASP, Sun JSP и подобные, но она коренным образом отличается от подобных систем:

  1. высокопроизводительной архитектурой
  2. тесной интеграцией с объектами Cache'
  3. простотой
  4. встроена в надежный и быстрый сервер базы данных
В отличие от ASP, JSP, PHP и прочих, здесь нет нескольких уровней промежуточного ПО между Вашими приложениями и их данными. Тесная интеграция с объектами означает, что, например, мастер форм может генерировать базовые элементы форм, код для контроля данных, поиска и сохранения автоматически. CSP-приложения не нуждаются во внешних COM-объектах, подключениях JDBC/ODBC или других сложностях. Наконец, CSP наследует все лучшие характеристики Cache'.

Рис 2.

CSP - это следующее поколение ПО для доступа к Cache' из web. Эта технология была представлена чуть более года назад на конференции разработчиков InterSystems, как замена Cache' Weblink и Weblink Developer. Это уже был не просто доступ к базе данных из web-приложения, CSP вписывалась в объектную модель вашей задачи, связывая объекты-страницы с объектами-данными.

CSP включает технологию Hyper-Events, с помощью которой появилась возможность обрабатывать на стороне сервера любые события, порождаемые действиями пользователя. Web-приложения, благодаря Hyper-Events и Dynamic HTML становятся столь же интерактивнми, способными реагировать на действия пользователя, как программы для MS Windows.

1.3. CSP на практике

Cache Server Pages позволяют серверу базы данных создавать высокоэффективные Web-страницы динамически. Для того чтобы сервер базы данных и Web-cepвер могли работать вместе, необходимо установить на Web-сервер средства доступа к Cache. В настоящее время Cache предоставляет интерфейсы к Web-серверам Microsoft, Netscape и Apache Group.

CSP-интерфейс на Web-сервере пересылает запросы, поступившие от Web-браузеров, в Cache. Программа использует расширение файлов .csp для определения, предназначен ли запрос для Web-сервера или для Cache.

Сервер базы данных разбирает данные, поступившие из браузера. Логика прило­жения использует эти данные для генерации HTML-кода, который Web-сервер передает в браузер для отображения.

Программа для обработки CSP-страниц находится в подкаталоге csp\bin каталога инсталляции Cache и называется CSPras.dll в Windows-системах (nphCSPcgi в UNIX). При вызове через URL эта программа использует переданные ей парамет­ры для определения сервера Cache, который будет обрабатывать этот запрос. Код на языке Cache ObjectScript, необходимый для выполнения логики приложе­ния, может быть размещен непосредственно внутри CSP-страниц. Как только Web-сервер распознает CSP-запрос, он немедленно направляет его, используя указан­ный интерфейс. Web-сервер предоставляет специальный серверный интерфейс прикладного программирования (API), характеризующийся высокой скоростью обработки. Через этот API осуществляется вызов требуемого приложения, которое, обработав полученный запрос, возвращает HTML-код в качестве результата. Web-сервер передает HTML-документ в браузер. CSP-технология управляет всем взаимодействием между Web-сервером и Cache, обеспечивая вызов необходимого прикладного кода из базы данных.

Web-сервер и сервер базы данных могут находиться как на одной машине, так и на различных машинах в сети. Сетевое соединение между ними образуется с использованием протокола TCP/IP. Минимальные требования к организации среды разработки и тестирования допускают размещение обоих серверов и браузера на одном PC. В примерах этой главы подразумевается именно эта кон ция.

1.4. Немного подробностей

Браузер запрашивает CSP-страиицу, используя URL следующего вида: http://<hostname>/<path>/<filename>.csp[?...]
где <hostname> указывает на Web-сервер, <path> задает виртуальный каталог на этом Web-сервере.

Однако файл <filename>.csp вовсе не обязан существовать в указанном каталоге на Web-сервере. По сути дела, каждая CSP-страница соответствует классу в базе дан­ных Cache. Такие классы могут быть созданы любым известным способом созда­ния классов, например, с использованием Cache Object Architect. Однако (и это является нормой) есть возможность создавать и изменять классы динамически. В этом случае код HTML просто сохраняется в файле в соответствующем каталоге. Когда Cache определяет (при первом вызове), что страница не представлена свя­занным с ней классом, Cache производит компиляцию и порождает класс. Ком­пиляция и сохранение ее результата на сервере базы данных приводит к тому. что все последующие вызовы этой страницы (класса) выполняются значительно быстрее, чем первый. Изменение исходной страницы приводит к перекомпиля­ции.

2. Первые шаги с CSP Web Gateway

Разработка Web-приложения с помощью Cache Web Gateway-дополнительного CSP-модуля для Internet Information Server, Apache и Web-сервера Netscape - делится на две части:

- дизайн Web-страниц;

- интеграцию логики приложения в эти страницы для обеспечения изменения их содержания.

Первая задача обычно реализуется Web-дизайнерами, которые создают страницы в соответствии с требованиями приложения и представления данных в браузере; это проблема пользовательского интерфейса. Они также гарантируют, что информация будет представлена потенциальным клиентам изящно и с максимальным эффектом. Обычно эта группа разработчиков не концентрируется на технических деталях содержимого страниц. За это отвечают программисты, которые лучше разбираются в логике взаимодействия, но вовсе не обязаны быть хорошими Web-дизайнерами.

Основная концепция CSP состоит в обеспечении общей, дружественной среды для обеих групп разработчиков с целью обеспечить их совместную работу без необходимости разработчикам одной группы вникать в особенности работы другой.

Вы можете использовать любой редактор HTML для создания Web-страниц. Если необходимо, вы можете даже использовать обычный редактор ASCII-текстов.

И дизайнеры страниц, и программисты в равной степени отвечают за создание и обработку HTML-страниц. Программист добавляет в текст HTML код (скрипт) на Cache и другие специальные теги. После того как страница готова, она компи­лируется при первом к ней обращении и сохраняется в виде описания класса в базе данных Cache.

Однако CSP-класс можно сформировать и с использованием Cache Object Architect. В этом случае любой HTML-код, создаваемый дизайнером Web-страниц, помеща­ется в метод OnPage этого класса.

Таким образом, разработка приложения, основанного на CSP, представляет собой создание набора статических HTML-страниц, оживляемых во время выполнения реальными данными, предоставляемыми базой данных Cache. А значит, исправление ошибок и дальнейшая разработка приложения производятся в связанных с ним HTML-страницах, а не в программах и глобалах, которые Cache создает в базе данных. Последние автоматически обновляются при запуске ком­пилятора классов после внесения изменений в CSP-страницы.

2.1.Конфигурированиe CSP Web Gateway

CSP Web Gateway включает в себя средство администрирования CSP Web Gat Management, Web-ориентированнный интерфейс для конфигурирования и установки приложений. Для запуска этого административного средства исподьзуется URL следующего вида:

http://localhost/csp/bin/CSPmsSys.dll

если используется Microsoft Internet Information Server, или же:

http://localhost/cgi-bin/nph-CSPcgiSys

если используется Web-сервер Apache под UNIX в предположении, что Web-ceрвер находится на той же самой машине, что и вызывающий браузер.

Web Gateway Management может быть использован для конфигурирования раз личных аспектов функционирования CSP. Мы здесь остановимся только на процессе создания и обслуживания приложения на основе Cache Server Pages. Описание других возможностей можно найти в документации по CSP.

2.2.Создание приложения

Приложение Cache создается в трех различных местах:

- создается каталог приложения на Web-сервере;

- создается приложение в менеджере конфигураций Cache (Cache Configuration Manager);

- конфигурируется CSP Web Gateway.

Рис.3. Создание виртуального каталога для Personal Web Server

На Web-cepвepe должен существовать виртуальный каталог для CSP-страниц. Если при установке Cache обнаруживает Web-сервер, каталог создается автоматически под именем /csp. Если Web-сервер устанавливается позднее, этот виртуальный каталог должен быть создан вручную. В случае Microsoft Personal Web Server это может быть сделано с помощью Personal Web Manager. В нем секция Advanced содержит кнопку Add, открывающую диалог Add directory (Добавить каталог). В пер­вом поле должен быть задан физический каталог для размещения CSP-файлов. В дальнейшем все файлы CSP-приложений должны сохраняться в этом каталоге операционной системы. Имя виртуального каталога — это путь, по которому фай­лы CSP будут доступны на Web-сервере, — должно быть csp, oн вводится во вто­ром поле. Кроме того, для этого пути должны быть установлены разрешение чте­ния и выполнения. (Это относится также ко всем подкаталогам, которые могут потребоваться)

Аналогичные настройки выполняются па других Web-серверах Microsoft. Дирек­тивы, необходимые для обработки CSP-файлов на Web-сервере Apache (вне зави­симости от их местоположения) после установки Cache, уже созданы в специаль­ном файле httpd.conf.

2.2.1. Описание приложения в менеджере конфигураций Cache

Редактор конфигурации Cache содержит закладку CSP, на которой перечислены все определенные СSP-приложения. Здесь может быть добавлено новое приложе­ние путем задания виртуального каталога /csp. Основные свойства приложения:

Таблица 1.Определение свойств приложения

область Область, в которой будет равотать приложение
Cache Physical Path Путь, по которому сервер Cache может получить физический доступ к файлам С5Р либо на том же сервере, либо сетевом диске
Рекурсия Признак того, что подкаталоги должны быть также включены
Автокомпиляция Признак того, что при изменении CSP-фалов связанный с ними класс в базе данных перекомпилируется автоматически
Класс событий Имя класса, чьи методы вызываются для обработки различных событий в приложении, например при тайм-ауте
Тайм-аут по умолчанию Время наступления таймаута в секундах (значение 900 подразумевает, что сессия завершится, если пользователь не ответит в течение 15 минут)
Суперкласс по умолчанию Суперкласс, чьи методы и свойства наследуют все CSP-классы. Если ничего не введено, то подразумевается суперкласс %CSP.Page
Файлы обслуживания Признак то го, что сервер Cache должен также передавать статические страницы, содержащиеся в каталоге приложения (желательно для стартовой и завершающей страницы приложения)
Страница по умолчанию Стартовая страница приложения, которая вызывается, если не задано никакое имя файла (соответствует Default. htm или index, htm на «нормальных» Web-серверах)
Custom Error Page Package Name Определенная пользователем страница сообщения об ошибке Имя пакета, в котором хранятся описания CSP классов. По умолчанию CSP

Обязательно должны быть заданы два первых параметра, для всех остальных обычно используется значение по умолчанию.

Далее для описания приложения на Web-сервере используется CSP Web Gateway Management. Этой цели служит кнопка Add application (Добавить приложение) в разделе Configuration | Application Access. Выбор Edit Application и нажатие Submit может быть использовано для редактирования существующего приложения.

2.2.2. Каталоги приложения.

Каждое приложение состоит из набора файлов HTML, содержащих встроенные скрипты Cache кода и другие специальные теги. Файлы HTML хранятся в общем каталоге приложения. Такой каталог должен быть создан как подкаталог каталога приложений, заданного для всей системы (так называемый глобальный каталог приложений).

Например, глобальный каталог приложений может быть задан как C:\Cachesys \CSP с тремя приложениями в нем: Aircraft, Crew Management и Reservations. Стра­ницы, относящиеся к конкретным приложениям, расположены в соответствую­щих подкаталогах:

С:\Cachesys\CSP\Aircraft

С:\Cachesys\CSP\Crewmanagement

C:\Cachesys\CSP\Reservations

Если Web-сервер запущен не на той же самой машине, что и Cache, глобальный каталог приложений должен находится на сервере базы данных либо должен быть доступен с него по сети.

2.2.3. Режимы работы приложения

Cache Web Gateway позволяет приложению работать в режиме state aware. В этом режиме для каждого пользователя между Web-сервером и сервером базы данных устанавливается постоянное соединение. Такой режим имеет то преимущество, что запросы каждого пользователя обрабатываются выделенным серверным процес­сом, которому не приходится отдавать часть своих ресурсов другим пользователям. Такой подход приводит к росту производительности и повышению безопасности.

Надо заметить, что по умолчанию установлен режим stateless. В этом режиме Web-интерфейс Cache обслуживает многих пользователей с помощью одного соединения. С точки зрения пользователя между этими двумя режимами нет различий. В предыдущих версиях Cache режим соединения необходимо было указывать при настройке приложения в Cache WebLink Developer Maintenance Suite. Начиная с версии 4, этот режим может изменяться динамически во время работы приложения с помощью параметров состояния. В разделе 11.3.2 это рассматривается подробнее.

2.2.4. Имена файлов и ссылки (URL)

Файлы HTML-страниц CSP-приложений обычно имеют расширение . csp. Однако сервер Cache также поддерживает и корректно передает HTML, SHTML,XML и различные графические файлы. Имена файлов чувствительны к регистру. Файлы, содержащие языковые элементы CSP, должны иметь расширение .csp. В остальном, к именам файлов применяются соглашения, принятые в используемой операционной системе. Поскольку каждая CSP-страница компилируется в класс Cache, ее имя должно быть также корректным именем класса. Для задания гиперссылки с одной страницы CSP-приложения на другую исполь­зуется полное имя страницы, включая расширение . csp.

Для обслуживания внутренней логики приложения и работы Web gateway исполь­зуется более сложный синтаксис. Однако Web gateway создает такие ссылки авто­матически, поэтому разработчик не обязан разбираться в этих подробностях. Cache Gateway автоматически преобразует простые URL, заданные программистом, в корректное внутреннее представление.

2.3. Обзор CSP-программирования

CSP является полностью объектно-ориентированной технологией. Она поддер­живает все фазы создания и сопровождения приложений, ориентированных на базы данных.

Технология Cache Server Pages работает как с полной сессией браузера, так и с ее частями, например, запросами и страницами. Запрос - это вызов HTTP-метода, включая CGI-переменные, элементы формы и строки запроса. Страница включа­ет в себя всю страницу, посылаемую в браузер, включая заголовки и содержание. CSP-страницы (файлы с расширением .csp) могут быть созданы как вручную, с использованием текстового редактора, так и с помощью специальных инструмен­тов разработки Web-страниц, таких как Macromedia Dreamweaver или Microsoft FrontPage. Cache даже обеспечивает наличие специальных пунктов меню в Dream­weaver, которые упрощают поддержку Cache Server Pages. Это возможно, поскольку Cache соответствует стандарту HTML, расширяя его специальными CSP-тегами (аналогично тому, как это делает XML).

Каждая страница CSP представлена в базе данных, как класс, создаваемый при ее компиляции. Программист может также породить такой класс непосредственно на Web-сервере, минуя этап создания HTML-страницы.

Незаметно для пользователя мощная база данных Cache обеспечивает доступ к хранимым данным как с использованием классов, так и с помощью SQL-запросов. Таким образом, CSP совмещает в себе преимущества объектно-ориентированной, дружественной среды разработки с функциональностью SQL-запросов, и все это поддерживается высокопроизводительным хорошо масштабируемым хранилищем данных.

2.3.1. Синтаксические элементы страниц

В дополнение к обычному HTML-коду CSP-страницы характеризуются элементами, способными динамически генерировать содержание. Такие динамические данные представлены объектами Cache, наборами данных (result sets), перемеными и другими элементами. Помимо классических тегов HTML CSP-страница Может содержать следующие элементы:

- Выражения в форме #(... )#, заменяемые во время выполнения (при генерации страницы) вычисленными значениями.

- Теги CSP В форме <CSP: ххх ... > , предоставляющие встроенную и определенную программистом функциональность.

- Выполняемый код на языке Cache Object Script для генерации страницы в момент выполнения приложения. Он заключен в скобки тега script следующей формы:

<script language= Cache runat=server> … </script>

- Следующий тип Cache-скрипта выполняется только в процессе компиляции страницы для сохранения результата в базе данных. Код его похож на предыдущий, однако открывающий тег выглядит по-другому: <script language=Cache runat=compile>

- Ссылки на другие CSP-страницы в форме #url(...)# или просто ссылки URL

- Обращение к подпрограммам, хранимым на сервере, в форме #server( )#.

2.3.2.Создание Cache Server Pages

Процесс разработки CSP-страниц похож на процесс разработки классических страниц HTML:

- Для создания и сохранения начальной версии страницы используется специ­альный инструментарий или обычный текстовый редактор.

- Содержимое и вид таких страниц тестируется на различных семействах Web-браузеров.

- Если необходимо, страница дорабатывается с помощью редактора, сохраняет­ся и просматривается в браузере заново.

Рис. 4 Добавление тега CSP:WHILE в Macromedia Dreamweaver

CSP-приложение первоначально создается в виде набора статических элементов HTML-страницах, которые затем получают расширение .csp. После этого в необходимые места добавляются CSP-теги, требуемые для получения динамического содержания. Для добавления CSP-тегов необходимо использовать возможности редактирования текстов редактора HTML.

Исключением является Macromedia Dreamweaver (начиная с 3-й версии), кото­рый позволяет, используя специальный пункт меню Insert > Cache CSP (см. рисунок), добавлять на страницу большинство элементов CSP,

2.3.3. Пример динамической страницы

Технология CSP предоставляет возможность определения пользовательских те­гов, основанную на XML, для представления динамического содержания; она от­носительно проста для изучения и использования. Эти теги имеют, однако, то пре­имущество, что позволяют использовать объекты Cache непосредственно на HTML-странице, В комбинации интуитивно понятного синтаксиса и прямого доступа к базе данных и проявляется подлинная мощь CSP.

Следующий пример показывает, как можно включить текущую дату в стартовую станицу приложения. Фрагмент кода:

<h2 align=center>Hello and welcome to our eshop </h2>

<h2 align=center> on #($Zdate($Horolog.9))# </h2>

содержит в качестве подставляемого значения вычисляемое выражение, исполь­зующее $Horolog и $Zdate для получения и форматирования текущей даты.

Рис.5. HTML-страница с динамически созданным содержимым

Синтаксическая конструкция #(...)# является одним из фундаментальных эле­ментов технологии CSP, Эта последовательность символов в HTML-странице ин­формирует Web-сервер, что сервер Cache должен вычислить выражение, содержа­щееся в таких скобках, и вернуть его значение. Фрагмент кода:

$Zdate($Horolog,9)

использует функцию $Zdate языка Cache Object Script для получения форматиро­ванной даты. В нашем примере используются два аргумента этой функции: системная переменная $Horolog, содержащая текущую дату и время в виде двух и чисел, и параметр форматирования 9, заставляющий функцию $Zdate вернуть дату в формате месяц, день и год, как показано на рис. 5.

2.3.4. Что делает браузер

Когда страница, содержащая две приведенные выше строки кода, сохраняется в месте, доступном серверу Cache, она может быть получена и отображена любым браузером.

Эта ссылка может быть использована в качестве URL, если и браузер, и Web сервер, и сервер базы данных запущены на одной и той же машине. В противном случае вместо local host необходимо ввести сетевое имя или IP-адрес Web-ceрвера.

Функция браузера “display source text” (показать исходный текст) позволяет увидеть текст, который Web-сервер вернул в качестве результата запроса в браузер, то есть чистый HTML-текст. Что-то типа:

<h2 align=center>on January 1. 2001 .</h2>

вместо второй строки исходного кода. Это ответ, который сервер Cache сгенериро­вал и вернул в ответ на запрос Web-сервера. Таким образом, при просмотре в бра­узере мы никогда не увидим исходный текст страницы, только динамически сгене­рированное содержание.

2.4. Работа с переменными в Cache Server Pages

Технология CSP позволяет использовать имена переменных, которые автоматически заменяются их значениями во время выполнения. Web-дизайнер может сво­бодно задавать основные свойства каждой переменной, например местоположе­ние на экране, формат и представление, не задумываясь об источнике ее значения во время выполнения. Эту задачу решает программист, который снабжает макет страницы элементами логики приложения и таким образом обеспечивает ее функ­циональность.

Очевидно, обе эти задачи может решать и один человек. Однако практика показы­вает, что вышеупомянутое разделение труда является предпочтительным, поскольку дает лучшие результаты, как с точки зрения функциональности, так и с точки зрения внешнего вида приложения.

2.4.1. Простая подстановка значения

Подстановка значения путем задания функции или системной переменной уже был продемонстрирован на примере текущей даты в предыдущем разделе. Продемонстрированный метод может быть применен для вставки значения переменной в любое место CSP-страницы.

Предположим, в переменной DOB хранится чья-то дата рождения. Тогда #(DOB)#

в любом месте страницы задаст ссылку на эту переменную. Вместо этой ссылки во время выполнения Cache подставляет текущее значение этой переменной и воз­вращает его (вместе с остальным содержимым страницы) через Web-сервер в браузер.

Для придания отображаемому значению необходимого внешнего вида эта ссылка может быть обрамлена любыми форматирующими тегами HTML. Например, дата может быть показана курсивом и отформатирована как заголовок. Необходимо заметить, что форматирование должно быть применено ко всему выражению (включая закрывающую скобку и символ «#»).

На использование переменных не накладывается никаких ограничений, поэтому они могут быть использованы как часть ссылки (URL), или в качестве параметра в HTML-теге.

Если указанная переменная в момент выполнения не существует, никакой замены не производится и в браузере появляется сообщение об ошибке. Однако если пе­ременная существует, но не имеет значения, не отображается ничего. Если содержимое строки составляет только эта переменная, не выводится вся строка.

2.4.2. Использование глобальных переменных

Наряду с локальными переменными, которые существуют только в рамках сеанса, подобным же образом в CSP могут быть включены и глобальные переменные из базы данных. Простым примером является счетчик обращений к странице (hit counter). Код скрипта для подсчета числа обращений и подстановки значений пе­ременных может выглядеть следующим образом:

<script language="Cache" runat="server"> Set ^VisitNumber=$Get(^VisitNumber)+1

</script>>

Вы #(^VisitNumber)#-й посетитель этой страницы. <br>

Первая строка открывает блок скрипта. Параметр language указывает в качестве языка Cache ObjectScript. Здесь также возможны JavaScript для Java Server Pages и VBScript для Microsoft's Active Server Pages. Оба эти языка скриптов также пра­вильно обрабатываются на страницах CSP. Параметр runat="server" информи­рует Web-сервер о том, что данный скрипт во время выполнения будет обрабатывать сервер Cache. Другое возможное значение этого параметра runat="compile"; указывает Cache на необходимость обработки скрипта только во время компиляции класса. Если параметр runat опущен, то предполагается обработка скрипта на клиент­ском компьютере (при загрузке страницы в браузер). Тег </stript> является закрывающей скобкой для блока кода скрипта. В приведенном примере код скрипта состоит из одной строки. Значение глобаль­ной переменной ^VisitNumber, хранимой в базе данных, увеличивается на едини­цу. Функция $Get получает значение этой пользовательской переменной из базы данных. Эта переменная может и не существовать, она будет создана и проинициализирована при первом обращении. Команда Set присваивает переменной новое значение.

Аналогичным образом с помощью конструкции #(...)# может быть отображено вычисляемое значение.

2.5. Дополнительные возможности CSP

Cache Server Pages предоставляют несколько дополнительных языковых элементов, которые позволяют создавать простые и в то же время изощренные процедуры выборки и отображения данных. Они включают:

- заранее определенные запросы к базе данных;

- циклы;

- условные конструкции.

2.5.1. Запросы к базе данных в CSP

Типичным применением запроса к базе данных является получение списка бест­селлеров в электронном книжном магазине. Обычно это список названий доступ­ных сейчас произведений, по каждому из которых пользователь может щелкнуть и получить более подробную информацию о книге. Поскольку список бестселлеров может непрерывно изменяться, это хороший пример динамического содержания Web-страниц.

Технология CSP предоставляет простые средства для использования ранее упо­мянутого класса Book. Для генерации списка бестселлеров каждый объект Book имеет свойство SalesSuccess, которое представляет собой средневзвешенное зна­чение объема продаж данной книги за определенный период времени. Это значе­ние облегчает определение степени популярности той или иной книги. Гиперссылки на информационные страницы, посвященные отдельным бестселле­рам, генерируются на основе списка названий, получаемого из базы данных с по­мощью заранее определенного SQL-запроса. Для этого и служит тег CSP:QUERV, позволяющий задать на CSP-странице класс (из которого должны быть получены данные) и имя ассоциированного с ним специального запроса. Это запрос являет­ся частью определения класса в базе данных (см. главы 1 и 4). В нашем случае в описании класса Book должен быть определен запрос ShowBestseller. Тег CSP:QUERY является одним из наиболее важных элементов языка CSP. Он обес­печивает динамическое представление данных на основе изменяющихся и слож­ных критериев, выступая в роли оболочки, позволяющей встраивать SQL-запро­сы непосредственно в HTML-страницы. Сервер Cache поддерживает подготовку и выполнение запроса к базе данных при старте приложения и автоматическое за­крытие запроса при завершении. Если коснуться подробностей, тег CSP:QUERY вы­полняет следующую работу:

- подключение к выбранному классу Cache;

- выполнение заданного запроса;

- взаимодействие CSP-страницы с результатами запроса (Result-felt).

Тег CSP:QUERY выполняет запрос к базе данных и присваивает имя результату выборки (объекту ResultSet). Это позволяет использовать результаты запроса внут­ри страницы. Тег CSP:QUERY имеет три атрибута (параметра):

- Name — имя объекта ResultSet;

- CLASSNAME — определяет класс Cache, содержащий определение запроса;

- QUERYNAME — задает имя запроса, который необходимо выполнить.

В примере имя ResultSet — Bestseller. Запрос ShowBestseler должен быть определен, как показано ниже:

SELECT TOP 10 BookTitle FROM Book

ORDER BY SalesSuccess DESC

Вызов CSP:QUERY оформляется следующим образом:

<СSP:QUERY NAME=Bestsellеr CLASSNAME=Book QUERYNAME=ShowBestseller>

Приведенный выше запрос не имеет параметров, он всегда возвращает 10 наиболее продаваемых книг, В документации по Cache описано, как можно расширить этот запрос с помощью параметров, чтобы придать ему большую гибкость.

После обработки запроса отфильтрованный результат становится доступен через объект ResultSet с именем Bestseller, ассоциированный с вызывающей страницей. Результат выборки может быть свободно использован и представлен на этой странице. Например, мы.можем использовать метод Get объекта Resultset для извлечения колонки BookTitle, которую мы далее просто выведем на экран-

#(Bestseller. Get("BookTitle"))#

Ссылка на информационную страницу может быть сформирована с использованием ID этой книги следующим образом:

<а href=BookInfo.csp?ID=#(Bestseller.Get("ID"))#>

В следующем разделе будет показано, как этот результат может быть представлен в виде таблицы.

2.5.2. Циклы в CSP

Обычно результат выборки состоит из нескольких записей. Нам необходим метод для доступа к этим записям как индивидуально, так и в цикле с последующим вы­водом в виде HTML-кода Web-страницы.

Аналогично языку программирования CSP предоставляет теги для управления ходом выполнения программы, Один из них — тег CSP:WHILE. Он обеспечивает циклическую генерацию фрагмента страницы в зависимости от того, выполнено условие или нет. Примером такого условия является достижение конца реультата выборки.

Тег CSP:WHILE включает параметр CONDITION, который задает условие окончания» цикла While . Все элементы, используемые для генерации результирующей страницы и расположенные после этого тега, будут повторены столько раз сколько выполнится цикл. Тег </CSP:WHILE> заканчивает этот блок. Таким образом, фрагмент для построчного вывода списка бестселлеров из предущего раздела будет иметь вот такой вид:

< С SP:WHILE CONDITI0N=Bestseller.Next()>

< а href=Bookinfo.csp?ID-#(Bestseller.Get("ID"))#>

#(Bestseller.Get("BookTitle"))# </a> <br>

</CSP:WHILE>

2.5.3. Условная генерация HTML

Наряду с циклической генерацией фрагментов Web-страницы CSP может управлять ветвлением процесса создания страницы в зависимости от некоторых условий.

Аналогично популярным языкам программирования, CSP предоставляет теги IF и E LSE с соответствующими им “ закрывающими скобками”.

2.5.4. Атрибут CSP:BIND

Атрибут CSP: BIND предоставляет элегантное средство получения данных из Cache' и записи модифицированных данных обратно в базу. Этот атрибут служит допол­нением к обычным тегам HTML.

CSP: BIND позволяет связывать HTML-формы непосредственно с объектами Cache. Поскольку при этом не требуется описывать никаких действий или программиро­вать дополнительные методы, это простейший путь связать данные, хранящиеся в виде объектов в базе данных, с Web-приложением. Рассмотрим следующий фраг­мент:

<CSP:QBJECT NAME=CurrentCust CLASSNAME=Customer

OBJECTID=#( %request.Get(“CustId”))#>

<FORM NAME=CurrentCustForm CSP:BIND+CurrentCust>

Фамилия : <INPUT TYPE=TEXT NAME=Name CSP:BlND=Name>

Имя : <INPUT TYPE=TEXT NAME=Surname CSP:BIND=Surname>

Адрес : <INPUT TYPE=TEXT NAME=Address CSP:BIND=Address>

Кредитная карта : <INPUT TYPE=TEXT NAME=Ccard CSP:BIND=Ccard>

</ Form >

Атрибут CSP: BIND используется и в заголовке формы, и в конкретных полях ввода, в заголовке он служит для привязки формы к конкретному объекту данных. С помощью тега CSP: OBJECT порождается объект Customer по его ID, присвоенному полю Custld (где-то вне этого фрагмента) и переданному в запросе. Теги С SP :В IND в от­дельных полях служат для визуализации и, возможно, изменения свойств объек­тов. При этом программисту нет необходимости делать что-нибудь еще для этой цели. Содержимое базы данных автоматически обновляется, когда пользователь нажимает кнопку Submit (здесь не показана).

Однако этот метод работает только в том случае, когда свойства объекта могут быть непосредственно отображены в полях ввода. Если же требуются дополнительные преобразования, как, например, в случае даты или времени, необходимо использовать стандартные методы обработки форм.

3. Взаимодействие с CSP

Представление изменяющихся данных — это только один из аспектов динамиче­ских Web-страниц. Другой аспект — это вз а им о действие между пользователем и сервером. Например, пользовательский ввод может сильно влиять на данные, ото­бражаемые в браузере. Иногда пользователь может даже изменять содержимое базы данных.

В этом отношении представляет интерес совместное использование CSP и форм, обслуживание запросов и сеансов, авторизация пользователей для определе­ния их уровня взаимодействия с базой данных. Здесь описаны основные шаги, с помощью которых Cache обрабатывает любой запрос, поступающий с Web-сервера:

- Создается новый объект % CSP .Request и ссылка на него помещается в пере­менную %request.

- Если это первый запрос в сеансе (последовательности запросов от одного браузера), создается новый объект % CSP .Session и ссылка на него присваивается переменной %session. В противном случае в нее записывается ссылка на уже существующий объект % CSP.Session.

- Cache вызывает метод Page класса %CSP.Page, соответствующий используемой гиперссылке (URL).

- При выполнении метода Page вызываются другие методы:

• Метод ОnРrеНТТР инициализирует страницу и порождает HTTP-заголовки, которые впоследствии пересылаются Web-сервером в браузер.

• Метод OnHeaders пересылает эти заголовки.

• Метод QnPage генерирует текущее содержимое страницы (HTML, XML, двоичный файл).

• Метод OnPostHTTP выполняет очистку.

- Объект %session существует до тех пор, пока сеанс не будет закрыт приложе­нием или пока не истечет тайм-аут. В обоих случаях вызывается метод end, служащий для корректного закрытия объекта %session.

3.1. Использование форм

Текст, введенный пользователем в форме, может быть передан Web-серверу с ис­пользованием HTTP-протокола двумя способами:

        Методом GET в виде части URL.

        Методом POST в теле запроса HTTP.

Например, следующая гиперссылка:

http:// myfirm.com/customer/info/LoginStatus.csp?CustoriterID=47110815

передает идентификатор ( ID ) клиента методом GET.

3.1.1. Объект %CSP.Request

В соответствии со стандартом HTML каждая форма ввода состоит из пар “имя/ значение”. Это не обязательно является результатом пользовательского клавиатурного ввода (например, скрытые поля па форме). Однако термин “поля ввода” исторически закрепился для обозначения подобных потоков данных, поэтому мы его здесь и используем.

Бывает, что с определенным именем поля связано несколько значений, например в случае текстового поля с возможностью множественного выбора. Вместе с неко­торой общей информацией, относящейся к запросу, входные данные формы пере­даются в базу данных классу %CSP. Page, соответствующему вызываемой CSP-странице. Это выполняется с помощью объекта %CSP. Request. При каждом вызове метода Page системная переменная %request содержит ссылку на текущий объект %CSP.Request.

Таким образом, в случае гиперссылки, приведенной выше, объект %С S Р.Request получит свойство URL со значением: "http://rnyf irm .com/custo mer /info/LoginStatus.csp"

плюс свойство PageName со значением LoginStatus. csp, а также поле с именем Custom e rlD и значением 47110815.

Как правило, ввод осуществляется с помощью форм HTML. В случае метода POST это означает, что когда содержимое формы передается, объект %request прини­мает четыре поля ввода формы: CustomerlD, Name, Address и City, как показало в следующем примере:

<form method="post" name=”Customer"

action=”/customer/info/CustomerUlpdate.csp?

Customer ID=47110815">

Name: <input type="text" name="Name">

Street <input type="text" name="Address">

City: <input type="text" name="City">

</ form >

Важно следующее: имена специфичных для Cache элементов, например CSPT oken начинаются с символов «CSP». Чтобы избежать конфликта, вы не должны ис­пользовать эти символы в качестве начальных для имен своих элементов данных. Следующая таблица представляет полный перечень свойств объекта

Таблица 2. Свойства объекта %request

Имя

Тип данных

Описание

Charset

% Library .String

Набор символов , в котором закодирован запрос ; если не указан

в заголовке HTTP, используется набор символов текущей страницы

ContentType

% Library .String

Тип содержимого (MIME), соответствующий заголовку HTTP

Cookies

Массив строковых значений

Набор Cookies, установленных в браузере и присланных Web-cepeep

CgiEnvs

Массив строковых значений

Полный набор переменных окружения CGI, включая их значения

Gateway-Application

% Library .String

Имя , под которым приложение было создано в Web Gateway Manage'

Gateway-Connection

Name

% Library .String

запрос

Имя соединения с сервером Cache в CSP Gateway, которому послан

Method

% Library .String

Метод HTTP ( например , GET)

New session

% Library . Boolean

ИСТИНА для первого соединения сеанса и ЛОЖЬ для всех остальных

PageName

% Library .String

Имя страницы CSP, например Login. csp

URL

% Library .String

Гиперссылка на заданную страницу , включая ее имя и расширение но без

любых элементов запроса (CGI)

userAgent

% Library .String

Тип браузера , из которого послан запрос ; соответствует заголовку http

User Agent

3.1.2. Использование результатов запроса

Встроенные методы объекта %request позволяют использовать полученные в запросе данные. Они описаны в следующей таблице.

Таблица 3. Методы объекта %request

Имя

Возвращаемое значение

Функция

Аргумент ( ы )

Count

%Library. Integer

Возвращает число значений для заданного имени поля

Имя поля ввода (%Library.string)

Get

Соответствует

аргументу

Извлекает данные , посланные в запросе

Имя поля ввода (% Library . String ), значение по умолчанию ("/ « .Library. String, необязатель­ный , default = » ), номер экземпляра (%LibraryJnteger. необязательный , по умолчанию !)

Kill

Нет

Удаляет поле ввода из объекта %request

Имя поля (%Li brary. String, необязательный ,

по умолчанию все ), номер экземпляра (% Library . Integer, необязательный , по умолчанию все ]

Next

%Library.String

Позволяет перебрать все поля ввода формы ; возвращает имя следующего поля

Имя предыдущего поля , или "" (%Library. String)

Set

Элемент данных

Присваивает измененное значение элементу данных поля ввода или создает новый элемент

Имя поля (% Library . String ), значение (% Lib гагу . String), номер экземпляра (^Library.Integer, необязательный , по умолчанию 1)

 

Каждый объект %request содержит в CgiEnvs набор переменных окружения для текущего Web-запроса. Каждый элемент этого набора состоит из имени перемен­ной окружения и ее текущего значения. Для получения доступа к требуемой пере­менной может быть использован метод GetCgiEnvO:

%request. GetCgi Env(name)

Таким образом

% request. GetCgiE nv( 'SERVER _NA ME")

Дает в качестве возвращаемого значения имя Web -сервера. Метод NextCgiEnv()

%request.NextCgiEnv(…)

позволяет получить все значения переменных окружения. Массив Cookies может быть обработан аналогично (методы GetCookieO, NextCoo k ie) и т. д. Метод Get ( ) объекта % request возвращает значение поля ввода, используя его имя Например, если страница CSP была вызвана при помощи следующей гиперссылки-http://W W W.myco m pany.com/csp/ i nfo/Log i nStatus.csp?CustomerID = 47110815 метод % request. Get ("Customer ID") вернет значение "47110815". Заметим: имена полей ввода чувствительны к регистру, то есть прописные и строчные буквы счита­ются различными. Следовательно, метод %request. Get ("customerid") должен в этом случае вернуть"".

Метод Get () может быть также вызван с необязательным вторым параметром, ко­торый задает значение по умолчанию вместо пустой строки: %request.Get ("Customer I D", "none") вернет или значение поля CustomerlD, или строку " none " в слу­чае его отсутствия.

3.1.3. Множественные значения поля ввода

В некоторых случаях в объекте %request содержатся множественные поля ввода. Имеется в виду, что одному имени принадлежит несколько значений. Это бывает, например, когда:

- один элемент формы возвращает несколько значений, например в случае мно­жественного выбора в теге SELECT;

- элемент формы (обычно это поле ввода текста) возвращает значение длиннее 32 кбайт; Cache автоматически разбивает его на несколько значений;

- форма содержит несколько полей ввода с одинаковыми именами;

- сгенерированная гиперссылка (URL) содержит одно и то же поле несколько раз. Хотя это обычно свидетельствует об ошибке в программе, иногда может быть и полезно.

Если объект %request получает поле данных с множественными значениями, в метод Get() может быть добавлен третий параметр; например, метод %request .Get ("CustomerlD", "none" ,4) позволит получить доступ к четвертому элементу поля CustomerlD. Если такой элемент не будет найден, функция вернет «пусто» в ка­честве результата. Если третий параметр опущен, подразумевается первый элемент.

Метод Count() возвращает для заданного имени число его значений, присутствующее в объекте %request. Это позволяет использовать следующий фрагмент кода для доступа ко всем значениям поля "Maxi".

For i=1:1:%request.Count(" Мaxi") {

Set x = %request.Get("Maxi",,i)

}

3.1.4. Путешествие по полям формы

Метод Next() является весьма мощным средством для обработки пользовательског ввода, позволяя чрезвычайно просто осуществить навигацию по всем полям данных, полученным Web-сервером от формы. Метод напоминает функцию $ Order в Cache ObjectScript, которая возвращает следующую локальную перемен­ную.

Допустим, передан следующий URL:

http:// myfirm. com/ customer/ info/ LoginStatus. csp? Status= s& CustomerID=47110815

Тогда вызов

%request.Next(“”)

вернет имя первого поля, в данном случае CustomerlD.

Почему первым полем данных будет CustomerlD, а не Status? Последовательность хранения полей в объекте %request не всегда совпадает с порядком появления отдельных

полей в запросе. На самом деле поля сортируются в порядке следования их имен, а точнее, в последовательности сортировки, определенной администратором во время установки Cache. Как правило, она соответствует порядку латинского алфавита. Для проверки этой настройки несложно создать тестовую страницу.

Вызов:

% request. Next ("CustomerID")

вернет Status, имя следующего поля данных. Наконец,

% request. Next ("Status")

вернет «», так как поле Status является последним.

 

3.1.5. Операции с объектом %request

 

Помимо чтения имен и значений полей имеется возможность изменения отдельных полей данных, хранящихся в объекте %request. Допустима не только корректировка существующих значений, но и создание новых полей данных. Например, вызов:

%request.Set("Length" , 12)

изменит значение поля Length на 12, если оно существует. В противном случае будет создано новое поле с именем Length и ему будет присвоено значение 12.

Вызов:

%request. Kill(“Length")

удалит из объекта %request поле Length со всеми его значениями. Если же задан второй параметр, метод Kill () удаляет только отдельные экземпляры значений множественного поля. Все уцелевшие значения перенумеровываются, поэтому

выборочное удаление не приводит к появлению «брешей» в нумерации значений.

Вызов:

% request . Kill ()

удаляет все поля данных объекта %request.

 

3.2. Управление сеансом

CSP позволяет отслеживать параметры состояния сеанса, такие как данные о пользователе, браузере, Web-сервере и базе данных. Именно это и превращает CSP в поистине эффективный инструмент. Понятие сеанса (session) позволяет исполь­зовать единый набор данных на протяжении всего сеанса. Например, когда посе­титель сайта делает on-line- покупку, можно обрабатывать и ввод, и информацию о транзакции как единый набор данных, несмотря на то, что эти данные могли быть получены с различных Web-страниц. Сеанс обеспечивает программиста средой, необходимой для реализации подобных Web- приложений.

Центральным звеном в управлении сеансом является объект %session. Подобно объекту %request (описанному ранее), объект %session автоматически создается Ca che и содержит информацию о пользовательском сеансе в виде пар «имя/значение”. Однако в отличие от объекта %request он не пересоздается при каждом запросе, а поддерживается на протяжении всего сеанса. При этом отдельные элементы дан­ных, связанные с сеансом, конечно же, могут претерпевать изменения. Объект %session создается, как только пользователь первый раз открывает CSP-страницу в браузере? и хранится до тех пор, пока сеанс не завершится (по иници­ативе приложения либо по тайм-ауту). По истечении сеанса объект уничтожается и занимаемая память освобождается. Если тот же самый пользователь обращается к другой странице приложения (а объект %session все еще существует), его за­прос будет отнесен к текущему сеансу; данные объекта %session будут доступны при обработке этого запроса.

3.2.1. Обработка пользовательского сеанса

При обработке пользовательского сеанса выполняются следующие внутрисистемные действия:

Если приложение закрывает пользовательский сеанс во время обработки страницы, удаляется и объект %session. Во всех прочих случаях объект просто деактивируется вплоть до поступления нового запроса от того же пользовать либо до закрытия сеанса по тайм-ауту.

3.2.2. Свойства объекта %session

Объект %session содержит ряд предопределенных полей, которые могут быть использованы при программировании CSP. При каждом вызове метода Page() происходит актуализация объекта %session параметрами текущего сеанса. Ниже вы найдете краткое описание предопределенных свойств класса % session.

Таблица 4. Свойства объекта %session

Имя

Тип данных

Описание

По умолчанию

AppTimeOut

%Library. Integer

Время ожидания следующего пользовательского ввода (с)

1200

EndSession

%Library. Boolean

Признак , указывающий , следует ли закрывать
приложение после обработки страницы

Ложь

OnAppTime-OutMethod

%Library. String

Имя метода , который должен быть выполнен в случае тайм - аута

onEndMethod

%Library. String

Имя метода , который должен быть выполнен
при нормальном завершении приложения

Preserve

%Library. String

Уровень контекста , который должен сохраняться
между запросами (0 — только обьект %session.
1 — все локальные переменные и открытые объекты ,
2 — полный контекст )

0

SessionId

%Library. Integer

Уникальный идентификатор сеанса ( только для чтения )

_

 

3.2.3. Методы объекта %session

Некоторые методы объекта %session уже были задействованы в примере.

Методы объекта %session имеют двойное назначение. Во-первых, они отслежи­вают системные настройки, действующие для сеанса, с целью оказания влияния на выполнение прикладной программы.

Во-вторых, что значительно более важно и используется гораздо чаще, эти методы позволяют обрабатывать пользовательские данные на протяжении всего сеанса передавать их от страницы к странице. Прикладная программа может просто с хранить необходимую информацию в объекте %session в виде пар «имя/значение” и использовать ее на любой другой странице.

Попутно заметим, что при сохранении в объекте %session наряду со встроенными типами данных Cache допустимы и пользовательские типы данных.


4. Пример приложения

Наше меленькое приложение состоит из трех CSP-страниц с HTML-кодом, тега­ми CSP и встроенным кодом на Cache ObjectScript:

Для начала рассмотрим, как функционирует этого приложение. Вызовем его, ис­пользуя ссылку: http:// L oca l host/csp/user/First.csp

Сначала появляется стартовая страница First.csp, содержащая лишь несложное главное меню нашего приложения:

В результате щелчка по пункту меню Выбор физического лица откроется страница Second.csp, как раз для этого и предназначенная.

Рис. 6. Главное меню нашего приложения

 

Рис. 7. Страница Second.csp — выбор физического лица

Рис. 8. Страница Third.csp — персональные данные

 

4.1. Создание CSP- страниц

Наше приложение работает в области USER, поэтому все три страницы хранятся в каталоге C:\Cachesys\csp\user. Наметить их структуру можно с помощью лю­бого редактора HTML (или даже с помощью текстового редактора).

Такой подход имеет свои преимущества: за исключением компиляции, процесс разработки CSP-страниц сводится к «традиционному» Web-проектированию. Это делает возможным разделение труда: доверив Web-дизайнеру оформление стра­ницы, программист может сосредоточиться на ее функциональном наполнении, таком как связь с базой данных, или, обобщая, на всем, что «у лошадки внутри». Чтобы отразить изменения в HTML-странице в базе данных, страница должна быть откомпилирована. Разумеется, это касается и новых страниц. Однако Cache сама проверяет актуальность хранимых классов, снимая эту заботу с программиста. Лишь небольшая задержка с ответом на запрос, полученный от браузера, свиде­тельствует о том, что произошла автоматическая компиляция. За исключением расширения, страница First. csp ничем не отличается от обыч­ных статических HTML-страниц. С точностью до заголовков, которые могут авто­матически добавляться редактором HTML, ее код имеет вид:

< body >

< h1>Главное меню</ h1>

< a href =” Second . csp ”>Выбор физического лица</ a >< br >

<a href=”/default.htm”> Завершение раболты </a><br>

</body>

Страница Second.csp, озаглавленная «Выбор физического лица», создает табли­цу из двух строк и четырех столбцов. В полях первой строки содержится текст: ID, Имя , Фамилия и Дата рождения. В конце страницы находится ссылка «Назад в ос­новное меню».

Исходный текст статической части страницы показан ниже (снова без заголов­ков):

< body bgcolor =”# FFFFFF ”>

< h1>Выбор физического лица</ h1>

<table border=”1” width=”81%”>

<tr>

<td width=”6%”><b>ID</b></td>

<td width=”31%”> <b> Имя </b></td>

<td width=”36%”><b> Фамилия </b></td>

< td width =”27%”>< b >Дата рождения</ b ></ td >

<tr>

<td width=”6%”></td>

<td width=”31%”></td>

<td width=”36%”></td>

<td width=”27%”></td>

</tr>

</table>

< p >< a href =” First . csp ”>Назад в основное меню</ a >

</body>

 

Следующий этап разработки страницы Second. csp — добавление тегов для органи­зации доступа к базе данных — должен быть выполнен в режиме редактирования исходного текста HTML вашего Web-редактора. Но сначала создадим страницу Third.csp. Ее заголовок выглядит так: Персональные данные (# (%r equest. Get ("Id "))#), поэтому ID физического лица, использованный как ссылка со страницы Second, csp, будет вставляться в заголовок при каждом вызове этой страницы. Эта передача значения происходит через объект % request. Для ото­бражения данных создается таблица, содержащая текстовые поля ввода с метками и кнопку Send (рис. 11.9). Метки и назначение полей соответствует именам пере­менных в Second.csp, которые, в свою очередь, позаимствованы у свойств класса Person.

 

Рис. 9. Форма для ввода персональных данных в редакторе Dreamweaver

4.2. Установление связи с базой данных

Для решения главной задачи страницы Second, csp — заполнения таблицы информацией из базы данных — достаточно лишь нескольких строк кода. Следует вы­полнить запрос Person. W ybor и заполнить строки HTML-таблицы данными, полу­ченными в результате выборки. Задача решается с помощью пары CSP-тегов и соответствующих ссылок.

Технически это потребует редактирования второй строки таблицы в странице Second.csp. В результате имеем:

<CSP: QUERY NAME="pers" CLASSNAM E="Person"

QUERYNAME=”Wybor”>

<CSP:WHILE CONDITION=pers.Next()>

<tr>

<td width=”6%”><a href=Third.csp?Id=#(pers.Get(“ID”))#>

#(pers.Get("ID"))#</a></td>

<td width=”31%”>#( pers.Get ("Name" ))#</td>

<td width=”36%”>#( pers.Get ("Surname" ))#</td>

<td width=”27%”>#(pers.Get("DateOfBirth"))#</td>

</tr>

</CSP:WHILE>

Тег CSP:QUERY после заголовка таблицы обеспечивает выполнение предопределен­ного запроса Wybor класса Person и сопоставление его результата с объектом pers типа ResultSet. Далее цикл WHILE выводит данные строка за строкой, используя ме­тод Next () объекта ResultSet для проверки условия завершения. Этот метод возвра­щает значение «пусто», когда все записи результата выборки исчерпаны. До тех пор пока это не так, соответствующие свойства объектов класса Person доступны с по­мощью метода Get() объекта ResultSet. Способ подстановки значений, полученных из Cache, в HTML-страницы нам уже знаком: #(... )#.

Щелчок по ссылке в столбце ID инициирует запрос к странице Third.csp и одно­временно передает ей параметр Id со значением, равным ID интересующего нас физического лица.

Перед страницей Third.csp стоят две задачи:

Для отображения данных достаточно лишь прочитать объект класса Person из базы данных, на который указывает идентификатор (ID), полученный со страницы Second.csp. Для этого используется тег CSP:OBJECT. В результате исходный код страницы приобретает следующий вид (таблица и форма ранее созданы редакто­ром HTML):

 

< h1> Персональные ванные (#(%request.Get("Id"))#):</hl>

<CSP:OBJECT NAME=pn CLASSNAME=Person

QBJID=#(%request.Get(“Id”)>#>

<form method="POST" name="PersDetail">

<input type="hidden" narne="FId"

value=#(%request.Get (" Id") )#>

<table border="l" width=“69%”>

<tr>

<td width="50%"> Фамилия </td>

<td width="50%”><input type="text" name="FName"

size="20" value="#(pn.Surname)#"></td>

</tr>

<td width="50%"> Имя </td>

<td width=”50%”><input type="text" name="FFirstname"

Size="20" val ue="# (pn. Name>#"></td>

</tr>

<tr>

< td width ="50%”>Дата рождения</ td >

<td width=”50%><input type="text" name=”FDOB”

size="20" value="($ZDate(pn.DateOfBirth))#"></td>

</tr>

<tr>

<td width=”50%”>&nbsp:</td>

<td width=”50%”><input type="submit"

value “Send” name="Bl"></td>

</tr>

</table>

</form>

<p><a href="Second.csp">Обратно </a></p>

Свойства объекта Person используются как начальные значения полей ввода фор­мы (атрибут value). Функция $ZDate преобразует дату рождения во внешнее представление. Несмотря на то что ID физического лица будет передаваться серверу вместе с другими с этой формы, отображать его на ней ни к чему. Поэтому он помещен в скрытое поле формы (FId).

Следующая задача — сохранение данных в базе — требует программирования ме­тода, вызываемого, как только пользователь нажмет на кнопку Send.

4.3. Обновление базы данных

Есть несколько способов решения этой задачи. Как правило, она требует включе­ния дополнительного кода в приложение Cache. Простейшее, хотя и не самое эле­гантное, решение состоит в использовании скрипта pre-page. Такие скрипты раз­мещаются где-либо в HTML-странице и извлекаются из нее во время компиляции. Страница может содержать не более одного скрипта pre-page, который распознается компилятором следующим образом:

По соглашению, скрипт pre-page размещают как можно ближе к началу страницы, предпочтительно после тега /HEAD. Ниже показан скрипт, расположенный между тегами /HEAD и BODY страницы Second. csp. Эта страница автоматически вызывается по нажатию кнопки Send, так что ей вполне доступны изменения, вносимые в базу данных:

<script language=Cache runat=server>

If %request.Get("FId")="" {

Set pn=##cl ass (Person).%OpenId(%request.Get( "FId"))

Set pn.Name=%request.Get("FName")

Set pn.Surname=%request.Get("FFirstname")

Set pn.DateOfBirth=$ZDateH(%request.Get(“FDOB”))

Set ok=pn.%Save()

If ok {

Do pn.%Close()

} Else {

Set Error="Error during save."

}

}

</script>

В строке заголовка скрипта в качестве языка указан Cache ObjectScript. Код должен выполняться на сервере базы данных (runat=server).

Наконец, придется внести совсем небольшое изменение в исходный текст страницы Third.csp. Оно коснется тега form, открывающего определение формы. Как правило, в параметре action указывается CGI-скрипт, обрабатывающий ввод с формы. В нашем случае он не требуется, поскольку скрипт pre-page страницы Second.csp выполняет всю необходимую обработку. Поэтому в параметре action достаточно указать только CSP-страницу:

<form method="POST" name="PersDetail" action="Second.csp">

Тем самым мы «одним махом» достигаем сразу двух целей: вносим изменения в базу

данных и отображаем обновленные данные в браузере.

4.4. Завершение Web-приложения

Переход по ссылке на главную страницу First.csp завершает наше Web-приложе­ние, закрывая сеанс и освобождая ресурсы для других процессов. Изначальный вариант:

<а href=/default .htm>3aвершение работы</а> <br>

расширим до:

<а href="/default.htm" onClick=

#server(" Set %session.EndSession=l")#>3aвершение работы</ а> <br>

Параметр гиперссылки onClick инициирует обработку строки кода на сервере Cache. Это наглядный пример обработки событий браузера с помощью серверных методов (server side methods) в Cache. Данная команда Set сообщает серверу, что текущий сеанс с пользователем должен быть завершен. Обратите внимание на про­бел перед командой Set. Завершение приложения приводит к тому, что Web-сер­вер переключается на страницу default.htm («Welcome page») из его главного каталога, прекращая взаимодействие с Cache.


На главную